/*
 * @Description: In User Settings Edit
 * @Author: your name
 * @Date: 2018-12-31 20:35:12
 * @LastEditTime: 2018-12-31 20:48:19
 * @LastEditors: Please set LastEditors
 */

// 代理模式是为一个对象提供一个代用品或占位符，以便控制对它的访问

// 假设当 A 在心情好的时候收到花，小明表白成功的几率有 60%，
// 而当 A 在心情差的时候收到花，小明表白的成功率无限趋近于 0。
// 小明跟 A 刚刚认识两天，还无法辨别 A 什么时候心情好。
// 如果不合时宜地把花送给 A，花 被直接扔掉的可能性很大，这束花可是小明吃了 7 天泡面换来的。
// 但是 A 的朋友 B 却很了解 A，所以小明只管把花交给 B，
// B 会监听 A 的心情变化，然后选 择 A 心情好的时候把花转交给 A

var Flower = function() {};
var xiaoming = {
    sendFlower: function(target) {
        var flower = new Flower();
        target.receiveFlower(flower);
    }
};
var B = {
    receiveFlower: function(flower) {
        A.listenGoodMood(function() {
            var flower = new Flower();
            A.receiveFlower(flower);
        });
    }
};
var A = {
    receiveFlower: function(flower) {
        // 监听 A 的好心情
        console.log('收到花 ' + flower);
    },
    listenGoodMood: function(fn) {
        setTimeout(function() { // 假设 10 秒之后 A 的心情变好
            fn();
        }, 10000);
    }
};
// xiaoming.sendFlower(B);

// 由上面的例子可以引出两种代理模式
// 保护代理
// 代理 B 可以帮助 A 过滤掉一些请求，比如送花的人中年龄太大的或者没有宝马的，
// 这种请求就可以直接在代理 B 处被拒绝掉
// 虚拟代理
// 假设现实中的花价格不菲，导致在程序世界里，
// new Flower 也是一个代价昂贵的操作， 那么我们可以把 new Flower 的操作交给代理 
// B 去执行，代理 B 会选择在 A 心情好时再执行 new Flower

// 应用场景
var myImage = (function() {
    var imgNode = document.createElement('img');
    document.body.appendChild(imgNode);
    return {
        setSrc: function(src) {
            imgNode.src = src;
        }
    }
})();
var proxyImage = (function() {
    var img = new Image;
    img.onload = function() {
        myImage.setSrc(this.src);
    }
    return {
        setSrc: function(src) {
            myImage.setSrc('file:// /C:/Users/svenzeng/Desktop/loading.gif');
            img.src = src;
        }
    }
})();
proxyImage.setSrc('http://imgcache.qq.com/music/photo/k/000GGDys0yA0Nk.jpg');